//有效三角形的个数
//给定一个包含非负整数的数组 nums ，返回其中可以组成三角形三条边的三元组个数。

import java.util.Arrays;
import java.util.Scanner;

//解析:
//解法一:暴力法
//解法二: 先排序!!!! 一对三角形,只要最大的那一条边小于剩下两条边的和就可以
//利用单调性,双指针
public class test5 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();//元素个数
        int[] nums = new int[count];
        for (int i = 0; i < count; i++) {
            nums[i] = in.nextInt();
        }
        Arrays.sort(nums);
        System.out.println(getResult(nums));
    }
    public static int getResult(int[] nums){
        int count = 0,n = nums.length-1;
        while (n>1){
            int left=0,right=n-1;
            //当n指到第二个元素时,就代表已经找完整个数组
            if(nums[n]!=0){
                count+=getNum(left,right,n,nums);
            }
            n--;
        }
        return count;

//        int count = 0,n = nums.length-1;
//        for (int i = n; i >=1 ; i--) {
//            int left = 0,right=i-1;
//            while (left<right&&nums[i]!=0){
//                if(nums[left]+nums[right]>nums[i]){
//                    count+=right-left;
//                    right--;
//                }else{
//                    left++;
//                }
//            }
//        }
//        return count;
    }
    public static int getNum(int left,int right,int n,int[] num){
        int count = 0;
        do {
            if (num[left] + num[right] > num[n]) {
                count += (right - left);
                right--;
            } else {
                left++;
            }
        } while (left <= right - 1);
        return count;
    }
}
